# _*_coding:utf-8_*_
#版本更新1：实现循环判断，思路先加一个死循环while1，可以实现不断输入，再加一个if。选中代码 统一进行缩进
#版本更新2：输入错误给与提示该如何输入，且实现对格式的控制
#版本更新3：对未包含的所有其他字符予以通过
#版本更新4(重构1)：对代码进行重构，使之变为pythonic (更多的使用python库中的函数),让它更精致，使用string库
#版本更新5(重构2)：去掉一些注释，去掉常量定义,直接使用string库中的函数
#版本更新6(重构3): 使用二进制 置位 按位与 按位或
import string

while 1:


    #TODO:用户输入密码
    user_password = input('请输入密码:')

    #TODO：判断密码的合法性(只是判断)
#置位：按位与
    #bin(0b01001 & 0b00001)
    #输出：0b1                 #具体操作是:若后面的某一位二进制是0，则不论前面的对应位置的二进制是0还是1，都湮灭处理
                                        #若后面的二进制为1，则将前面的二进制赋值为1
                             #作用：提取前边的二进制的某一位
#置位：按位或
    #bin(0b01000 | 0b00001)
    #输出：0b1001             #具体操作是：从左到右，若前边的二进制为0，后边的二进制为1，则湮灭
                                               #若首次遇到前边的二进制为1，后边的二进制为0，则保留前边的二进制
                                               #从此开始，后边的二进制为0，则也保留前边的二进制
                                                      # 后边的二进制为1，则将前边的二进制赋值为1
                             #作用：去掉前边的二进制的无效的0，且实现对前边的二进制的某一位，进行赋值。
    #不论是按位与，还是按位或，只要后边的二进制为1，则将前边的二进制赋值为1 这是通用的
    ###还不太清楚，还要再研究。

    #实现方法（要多想几种）：1 都打出来存进去，2 用ascii码表 3 不记得ascii码表 直接'A'<&&<'Z'

    #初始化对应条件的标准
    #利用置位二进制进行代替
    password_state = 0b00000    #下边有5个条件，所以设置5个0.

    #have_upper = False
    #have_lower = False
    #have_digit = False
    #have_punctuation = False

    #遍历各个条件
    for char in user_password: #取消常量的定义，直接使用string库中的文件
        if char in string.ascii_uppercase:
            password_state = password_state | 0b10000     #表明第一个条件成立
            #have_upper = True
        elif char in string.ascii_lowercase:
            password_state |= 0b01000  # 表明第二个条件成立     #可以简写成 |=
            have_lower = True
        elif char in string.digits:
            password_state |= 0b00100  # 表明第三个条件成立
            have_digit = True
        else:
            password_state |= 0b00010  # 表明第四个条件成立
            have_punctuation = True     #都不满足，则为其它字符
    if len(user_password) >= 8:            #这是一个判断语句，结果输出是 True or False
        password_state |= 0b00001  # 表明第五个条件成立

    #is_secure =(password_state == 0b11111)        #为避免优先级出错，则使用括号来实现
    #发现is_secure 只用了一次 所以将下边的if条件 直接换成 上一条语句括号里的
    #is_secure = have_upper \
    #    and have_lower \
    #    and have_digit \
    #    and have_punctuation \
    #    and have_enough_char

    #todo:输出结果

    if password_state == 0b11111:
        print('密码符合要求！')
        break
    else:
        tishi = '密码不符合要求，'
        #if not have_enough_char:
        if password_state & 0b00001 == 0:     #( 取 password_state 的最后一位 看看是不是等于 0b00001)
            tishi = tishi + '长度不足8，'
        #if not have_upper:         #这里要用if 而不能用elif ,elif是上一条指令不成立 才判断下一条指令 (这里可以都不满足 所以是\#平行关系，所以用if
        if password_state & 0b10000 == 0:

            tishi = tishi + '没有包含大写字符，'
        #if not have_lower:
        if password_state & 0b01000 == 0:

            tishi += '没有包含小写字符，'     # += 的快捷方式 -= 的快捷方式
        #if not have_digit:
        if password_state & 0b00100 == 0:
            tishi += '没有包含数字，'
        #if not have_punctuation:
        if password_state & 0b00010 == 0:
            tishi += '没有包含标点,'
        #优化：如何去掉末尾逗号，用切片

        tishi = tishi[:-1]       #去掉标准符号

        print(tishi)






